package com.stephen.data.search;

/**
 * @author: stephen
 * @create: 2020-02-01 11:37
 * @description: 插值查找
 * 要查找的值,也参与到mid的计算中,速度很快
 * 对于数据量较大,关键字分布较均匀时,很适合
 * 若关键字分布不均匀,则不一定比二分查找好
 */
public class InsertValueSearch {

    public static void main(String[] args) {
        int[] arr = new int[100];
        for (int i = 0; i < 100; i++) {
            arr[i] = i + 1;
        }
        int index = insertValueSearch(arr, 0, arr.length - 1, 12);
        System.out.println("index=" + index);

    }

    public static int insertValueSearch(int[] arr,int left,int right,int findVal) {
        System.out.println("--------------");

        // findVal < arr[0] || findVal > arr[arr.length - 1]
        // 这个判断必须有,否则,mid可能会越界,因为findVal参与到了mid的求值
        if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
            return -1;
        }
        // 自适应求mid值
        int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
        int midVal = arr[mid];
        if (findVal > midVal) {
            return insertValueSearch(arr,mid + 1,right,findVal);
        } else if (findVal < midVal) {
            return insertValueSearch(arr,left,mid - 1,findVal);
        } else {
            return mid;
        }
    }
}
